import { to as tos } from 'await-to-js';
import router from './router';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import { getToken } from '@/utils/auth';
import { isHttp } from '@/utils/validate';
import { isRelogin } from '@/utils/request';
import useUserStore from '@/store/modules/user';
import useSettingsStore from '@/store/modules/settings';
import usePermissionStore from '@/store/modules/permission';
import { createWebHistory, createRouter, RouteRecordRaw } from 'vue-router';
import Layout from '@/layout/index.vue';



NProgress.configure({ showSpinner: false });
const whiteList = ['/login', '/register', '/social-callback'];

export const constantRoutes: RouteRecordRaw[] = [
  {
    path: '/redirect',
    component: Layout,
    hidden: true,
    children: [
      {
        path: '/redirect/:path(.*)',
        component: () => import('@/views/redirect/index.vue')
      }
    ]
  },
  {
    path: '/social-callback',
    hidden: true,
    component: () => import('@/layout/components/SocialCallback/index.vue')
  },
  {
    path: '/login',
    component: () => import('@/views/login.vue'),
    hidden: true
  },
  {
    path: '/register',
    component: () => import('@/views/register.vue'),
    hidden: true
  },
  {
    path: '/:pathMatch(.*)*',
    component: () => import('@/views/error/404.vue'),
    hidden: true
  },
  {
    path: '/401',
    component: () => import('@/views/error/401.vue'),
    hidden: true
  },
  {
    path: '',
    component: Layout,
    redirect: '/index',
    children: [
      {
        path: '/index',
        component: () => import('@/views/index.vue'),
        name: 'Index',
        meta: { title: '数字人', icon: '', affix: true }
      }
    ]
  },
  {
    path: '/product',
    component: Layout,
    redirect: '/product',
    children: [
      {
        path: 'product',
        component: () => import('@/views/system/product/index.vue'),
        name: 'product',
        meta: { title: '产品资料', icon: '' }
      }
    ]
  },
  {
    path: '/liveStream',
    component: Layout,
    redirect: '/liveStream',
    children: [
      {
        path: 'liveStream',
        component: () => import('@/views/system/liveStream/index.vue'),
        name: 'liveStream',
        meta: { title: '直播话术', icon: '' }
      }
    ]
  },
  {
    path: '/workArr',
    component: Layout,
    redirect: '/workArr',
    children: [
      {
        path: 'workArr',
        component: () => import('@/views/system/workArr/index.vue'),
        name: 'workArr',
        meta: { title: '作品管理', icon: '' }
      }
    ]
  },
  {
    path: '/individual',
    component: Layout,
    redirect: '/individual',
    children: [
      {
        path: 'individual',
        component: () => import('@/views/system/individual/index.vue'),
        name: 'individual',
        meta: { title: '个人中心', icon: '' }
      }
    ]
  },
  {
    path: '/user',
    component: Layout,
    hidden: true,
    redirect: 'noredirect',
    children: [
      {
        path: 'profile',
        component: () => import('@/views/system/user/profile/index.vue'),
        name: 'Profile',
        meta: { title: '个人中心', icon: 'user' }
      }
    ]
  }
];

router.beforeEach(async (to, from, next) => {
  NProgress.start();
  if (getToken()) {
    to.meta.title && useSettingsStore().setTitle(to.meta.title);
    /* has token*/
    if (to.path === '/login') {
      next({ path: '/' });
      NProgress.done();
    } else if (whiteList.indexOf(to.path as string) !== -1) {
      next();
    } else {
      if (useUserStore().roles.length === 0) {
        isRelogin.show = true;
        let accessRoutes = await usePermissionStore().generateRoutes();
        if (accessRoutes) {
          accessRoutes = constantRoutes
        }
        // 根据roles权限生成可访问的路由表
        accessRoutes.forEach((route) => {
          if (!isHttp(route.path)) {
            router.addRoute(route); // 动态添加可访问路由表
          }
        });
        next();

        // 判断当前用户是否已拉取完user_info信息
        // const [err] = await tos(useUserStore().getInfo());
        // if (err) {
        //   await useUserStore().logout();
        //   ElMessage.error(err);
        //   next({ path: '/' });
        // } else {
        //   isRelogin.show = false;
        //   const accessRoutes = await usePermissionStore().generateRoutes();
        //   // 根据roles权限生成可访问的路由表
        //   accessRoutes.forEach((route) => {
        //     if (!isHttp(route.path)) {
        //       router.addRoute(route); // 动态添加可访问路由表
        //     }
        //   });
        //   // @ts-ignore
        //   next({ path: to.path, replace: true, params: to.params, query: to.query, hash: to.hash, name: to.name as string }); // hack方法 确保addRoutes已完成
        // }
      } else {
        next();
      }
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path as string) !== -1) {
      // 在免登录白名单，直接进入
      next();
    } else {
      const redirect = encodeURIComponent(to.fullPath || '/');
      next(`/login?redirect=${redirect}`); // 否则全部重定向到登录页
      NProgress.done();
    }
  }
});

router.afterEach(() => {
  NProgress.done();
});
